package netty.simple;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

/**
 * description:
 * author:zt
 * date:2021-09-19
 */

/**
 * 自定义一个handler 需要继承netty规定好的某个HandlerAdapter（规范）
 * 事件驱动，以下方法都是事件发生就触发方法执行（比如channelRead就是通道中一有数据可以读，就执行当中的操作）
 * ChannelInboundHandlerAdapter （inbound表示入栈，即对于server而言是传入的，比如读取客户端发来的信息）
 */
public class NettyServerHandler extends ChannelInboundHandlerAdapter {

    /*
        读取数据实际（治理我们可以读取客户端发送的消息）
        1.ChannelHandlerContext ctx：上下文对象，含有 管道pipeline，通道channel，地址
        2.Object msg：客户端发送的数据
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("server ctx = " + ctx);
        //将msg转成ByteBUf （不是nio的ByteBuffer，nio升级版）
        ByteBuf buf = (ByteBuf) msg;
        System.out.println("客户端发送的消息是：" + buf.toString(CharsetUtil.UTF_8));
        System.out.println("客户端地址：" + ctx.channel().remoteAddress());
    }

    //数据读取完毕
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        //将数据写入缓冲并刷新
        ctx.writeAndFlush(Unpooled.copiedBuffer("hello,客户端",CharsetUtil.UTF_8));
    }

    //处理异常，关闭通道
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
